package com.ccc.scala.base6_object

object Object08_Abstract {
  def main(args: Array[String]): Unit = {
    // 面向对象 - 抽象
    // 抽象 即 不完整
    // 抽象类、抽象方法

    // 抽象类无法实例化
    // new User() // ERROR
    new Child()

    //

  }

  abstract class User {
    // Scala中不完整的方法就是抽象，所以无需增加abstract关键字
    def test(): Unit

    // Scala中属性也可以是抽象的
    // 编译时，不会在类中声明属性，而是会声明属性的“抽象”的set和get方法，
    var name: String

    // 抽象类中可以有完整方法
    def test2(): Unit = {
      println("parent method...")
    }

    val age: Int = 24
  }

  class Child extends User {
    // 子类继承抽象类之后，可以声明为抽象类，也可以将父类的抽象方法补充完整
    override def test(): Unit = {

    }

    // 属性：编译时，会在类中声明私有属性，同时提供set和get方法，并且为公共的
    var name: String = "CJ"

    // 子类重写父类的完整方法时，必须添加override关键字
    override def test2(): Unit = {
      println("child method...")
    }

    // 子类也可以重写父类的完整属性，必须添加override关键字
    override val age: Int = 23

  }

}
